home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / bbs_util / bsrc_260.zip / SRC.ZIP / MAILROOT.C < prev    next >
C/C++ Source or Header  |  1996-03-26  |  21KB  |  883 lines

  1. /*--------------------------------------------------------------------------*/
  2. /*                                                                          */
  3. /*                                                                          */
  4. /*      ------------         Bit-Bucket Software, Co.                       */
  5. /*      \ 10001101 /         Writers and Distributors of                    */
  6. /*       \ 011110 /          Freely Available<tm> Software.                 */
  7. /*        \ 1011 /                                                          */
  8. /*         ------                                                           */
  9. /*                                                                          */
  10. /*              (C) Copyright 1987-96, Bit Bucket Software Co.              */
  11. /*                                                                          */
  12. /*                 This module was written by Bob Hartman                   */
  13. /*                                                                          */
  14. /*                   BinkleyTerm Mail Control Routines                      */
  15. /*                                                                          */
  16. /*                                                                          */
  17. /*    For complete  details  of the licensing restrictions, please refer    */
  18. /*    to the License  agreement,  which  is published in its entirety in    */
  19. /*    the MAKEFILE and BT.C, and also contained in the file LICENSE.260.    */
  20. /*                                                                          */
  21. /*    USE  OF THIS FILE IS SUBJECT TO THE  RESTRICTIONS CONTAINED IN THE    */
  22. /*    BINKLEYTERM  LICENSING  AGREEMENT.  IF YOU DO NOT FIND THE TEXT OF    */
  23. /*    THIS  AGREEMENT IN ANY OF THE  AFOREMENTIONED FILES,  OR IF YOU DO    */
  24. /*    NOT HAVE THESE FILES,  YOU  SHOULD  IMMEDIATELY CONTACT BIT BUCKET    */
  25. /*    SOFTWARE CO.  AT ONE OF THE  ADDRESSES  LISTED BELOW.  IN NO EVENT    */
  26. /*    SHOULD YOU  PROCEED TO USE THIS FILE  WITHOUT HAVING  ACCEPTED THE    */
  27. /*    TERMS  OF  THE  BINKLEYTERM  LICENSING  AGREEMENT,  OR  SUCH OTHER    */
  28. /*    AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO.      */
  29. /*                                                                          */
  30. /*                                                                          */
  31. /* You can contact Bit Bucket Software Co. at any one of the following      */
  32. /* addresses:                                                               */
  33. /*                                                                          */
  34. /* Bit Bucket Software Co.        FidoNet  1:104/501, 1:343/491             */
  35. /* P.O. Box 460398                AlterNet 7:42/1491                        */
  36. /* Aurora, CO 80046               BBS-Net  86:2030/1                        */
  37. /*                                Internet f491.n343.z1.fidonet.org         */
  38. /*                                                                          */
  39. /* Please feel free to contact us at any time to share your comments about  */
  40. /* our software and/or licensing policies.                                  */
  41. /*                                                                          */
  42. /*--------------------------------------------------------------------------*/
  43.  
  44. /* Include this file before any other includes or defines! */
  45.  
  46. #include "includes.h"
  47.  
  48. static char *LOCALFUNC estring (int, int);
  49. static void scan_netmail (char *);
  50.  
  51. int 
  52. do_mail (ADDRP baddr, int type)    /* 1 = manual, 0 = normal, -1 = CM */
  53. {
  54.     int i;
  55.  
  56.     long callstart = 0, callend;
  57.  
  58.     b_init ();
  59.     caller = 1;
  60.     got_packet = 0;
  61.     got_arcmail = 0;
  62.     got_mail = 0;
  63.     got_fax = 0;
  64.     sent_mail = 0;
  65.     no_WaZOO_Session = no_WaZOO;
  66.     no_EMSI_Session = no_EMSI;
  67.     callstart = 0L;
  68.  
  69.     (void) sprintf (junk, "%s", Full_Addr_Str (baddr));
  70.  
  71.     called_addr = remote_addr = *baddr;    /* structure assignment */
  72.  
  73.     if (!net_params)
  74.     {
  75.         status_line (MSG_TXT (M_INSUFFICIENT_DATA));
  76.         set_xy ("");
  77.         return (0);
  78.     }
  79.  
  80.     if (!nodeproc (junk))
  81.         return (0);
  82.  
  83.     if (type > 0)
  84.     {
  85.         if (flag_file (TEST_AND_SET, &called_addr, 1))
  86.         {
  87.             if (CARRIER)
  88.                 mdm_hangup ();
  89.             return (0);
  90.         }
  91.  
  92.         if (CARRIER ||                        /* called manually maybe? */
  93.             (ExtMailMask && (newnodedes.ModemType == (byte)ExtMailMask)))
  94.             goto process_the_damned_mail;    /* yup, just do some mail */
  95.  
  96.         do_dial_strings ();
  97.         try_2_connect ((char *) (newnodedes.PhoneNumber));    /* try to connect */
  98.     }
  99.     else
  100.     {
  101.         /* If this is supposed to be only local, then get out if it isn't */
  102.         if (type == 0)
  103.         {
  104.             if (e_ptrs[cur_event].behavior & MAT_LOCAL)
  105.             {
  106.                 if (e_ptrs[cur_event].node_cost < 0)
  107.                 {
  108.                     if ((int) newnodedes.RealCost < -e_ptrs[cur_event].node_cost)
  109.                     {
  110.                         return (0);
  111.                     }
  112.                 }
  113.                 else
  114.                 {
  115.                     if ((int) newnodedes.RealCost > e_ptrs[cur_event].node_cost)
  116.                     {
  117.                         return (0);
  118.                     }
  119.                 }
  120.             }
  121.             /* If it is supposed to be 24 hour mail only, get out if it isn't */
  122.             if ((newnodelist || version7) &&
  123.                 (!(e_ptrs[cur_event].behavior & MAT_NOMAIL24)) &&
  124.                 (!(newnodedes.NodeFlags & B_CM)))
  125.                 return (0);
  126.             /* If we aren't supposed to send to CM's now, get out */
  127.             if ((newnodelist || version7) &&
  128.                 (e_ptrs[cur_event].behavior & MAT_NOCM) &&
  129.                 (newnodedes.NodeFlags & B_CM))
  130.                 return (0);
  131.         }
  132.  
  133.         /* Try to connect */
  134.  
  135.         if (flag_file (TEST_AND_SET, &called_addr, 1))
  136.         {
  137.             if (CARRIER)
  138.                 mdm_hangup ();
  139.             return (0);
  140.         }
  141.  
  142.         do_dial_strings ();
  143.         if (un_attended && fullscreen)
  144.         {
  145.             sb_move (holdwin, 2, 1);
  146.             sb_wa (holdwin, colors.calling, 31);
  147.         }
  148.  
  149.         callstart = time (NULL);
  150.  
  151.         if (!blank_on_key)
  152.             screen_blank = 0;
  153.  
  154.         if (ExtMailMask && (newnodedes.ModemType == (byte)ExtMailMask))
  155.             goto process_the_damned_mail;
  156.  
  157.         if ((i = try_1_connect ((char *) (newnodedes.PhoneNumber))) < 0)
  158.         {
  159.             if (un_attended && fullscreen)
  160.             {
  161.                 sb_move (holdwin, 2, 1);
  162.                 sb_wa (holdwin, colors.hold, 31);
  163.             }
  164.             (void) flag_file (CLEAR_FLAG, &called_addr, 1);
  165.             return (i);
  166.         }
  167.     }
  168.  
  169. process_the_damned_mail:
  170.  
  171.     if (CARRIER ||                /* if we did,        */
  172.         (ExtMailMask && (newnodedes.ModemType == (byte)ExtMailMask)))
  173.     {
  174.         if (!callstart)
  175.             callstart = time (NULL);
  176.         b_session (1);            /* do a mail session  */
  177.         if (remote_pickup != -2)
  178.             mdm_hangup ();
  179.  
  180.         callend = time (NULL);
  181.         hist.last_Elapsed = callend - callstart;
  182.  
  183.         hist.callcost += cost_of_call (1, callstart, callend);
  184.  
  185.         ++hist.connects;
  186.         if (un_attended && fullscreen)
  187.         {
  188.             do_today ();
  189.         }
  190.  
  191.         write_stats ();
  192.  
  193.         if (un_attended && (got_arcmail || got_packet || got_mail))
  194.         {
  195.             (void) bad_call (baddr, -1);
  196.             receive_exit ();
  197.         }
  198.         if (un_attended && fullscreen)
  199.         {
  200.             sb_move (holdwin, 2, 1);
  201.             sb_wa (holdwin, colors.hold, 31);
  202.         }
  203.         return (1);
  204.     }
  205.     else
  206.     {
  207.         status_line (MSG_TXT (M_END_OF_ATTEMPT));
  208.         (void) flag_file (CLEAR_FLAG, &called_addr, 1);
  209.     }
  210.     if (un_attended && fullscreen)
  211.     {
  212.         sb_move (holdwin, 2, 1);
  213.         sb_wa (holdwin, colors.hold, 31);
  214.     }
  215.     write_stats ();
  216.     return (2);
  217. }
  218.  
  219. int 
  220. handle_inbound_mail (int answer_now)
  221. {
  222.     long t;                        /* used for timeouts  */
  223.     long lEndTime;                /* master timeout     */
  224.     int iRingCount = 0;            /* for counting 'em   */
  225.     int mr;                        /* Modem response     */
  226.     int iInterval = 6000;        /* Default wait = 1min*/
  227.     long callstart, callend;
  228.  
  229.     no_WaZOO_Session = no_WaZOO;
  230.     no_EMSI_Session = no_EMSI;
  231.  
  232.     caller = 0;
  233.  
  234.     (void) memset ((char *) &remote_addr, 0, sizeof (remote_addr));
  235.     remote_addr.Domain = NULL;    /* only Microsoft can explain this */
  236.  
  237.     /* Master timeout of 2 minutes */
  238.  
  239.     lEndTime = timerset (12000);
  240.  
  241. inloop:
  242.  
  243.     /* Do we have carrier, RING, or NO DIAL TONE? */
  244.  
  245.     if (timeup (lEndTime) || ((answer_now <= 0) && !(server_mode && CARRIER) && !CHAR_AVAIL ()))
  246.     {
  247.         time_release ();
  248.         return (0);                /* No, nothing to do  */
  249.     }
  250.  
  251.     mail_only = 1;
  252.     if ((cur_event >= 0) && (e_ptrs[cur_event].behavior & MAT_BBS))
  253.         mail_only = 0;
  254.  
  255.     if (KEYPRESS ())            /* If aborted by user,        */
  256.         return (1);                /* get out                    */
  257.  
  258.     if (server_mode && CARRIER)
  259.     {
  260.         mr = CONNECTED;
  261.         goto got_carrier;
  262.     }
  263.  
  264.     if (answer_now > 0)
  265.     {
  266.         mr = RINGING;            /* say it rang                 */
  267.         iRingCount = ring_wait;    /* we want to answer right now */
  268.         answer_now = -1;
  269.     }
  270.     else
  271.         mr = modem_response (500);
  272.  
  273.     if ((mr == RINGING) && (ans_str != NULL))    /* saw RING  */
  274.     {
  275.         iRingCount++;
  276.  
  277.         /* Unblank on the first ring */
  278.  
  279.         if ((answer_now < 0) || (iRingCount == 1))
  280.         {
  281.             if (!blank_on_key)
  282.                 screen_blank = 0;
  283.  
  284.             if (un_attended && fullscreen)
  285.                 sb_show ();
  286.         }
  287.  
  288.         /* Answer if we've reached the correct ring number */
  289.  
  290.         if (iRingCount >= ring_wait)
  291.         {
  292.             /*
  293.              * Try to make sure we don't send out the answer string 
  294.              * while stuff is still coming from the modem.  Most modems
  295.              * don't like that kind of sequence (including HST's!).
  296.              */
  297.  
  298.             t = timerset (100);
  299.             while (CHAR_AVAIL () && (!timeup (t)))
  300.             {
  301.                 t = timerset (100);
  302.                 (void) MODEM_IN ();
  303.             }
  304.             CLEAR_INBOUND ();
  305.             mdm_cmd_string (ans_str, 0);    /* transmit the answer string */
  306.  
  307.             iInterval = 6000;
  308.         }
  309.         /* Otherwise wait up to 15 seconds for something to happen */
  310.         else
  311.             iInterval = 1500;
  312.     }
  313.     else if (mr == FAILURE)        /* If we got "No Carrier" */
  314.     {
  315.         time_release ();
  316.         return (0);                /* Nothing happened...    */
  317.     }
  318.     else if (mr == CONNECTED || mr >= FAX)
  319.         goto got_carrier;
  320.  
  321.     
  322.     t = timerset (iInterval);/* set the interval timer    */
  323.     while ((!timeup (t))
  324.         && (!CHAR_AVAIL ())
  325.         && (!KEYPRESS ()))
  326.     {
  327.         time_release ();    /* wait for another result    */
  328.     }
  329.     goto inloop;            /* then proceed along         */
  330.  
  331. got_carrier:
  332.  
  333.     if (!blank_on_key)
  334.         screen_blank = 0;
  335.  
  336.     if (un_attended && fullscreen)
  337.         sb_show ();
  338.  
  339.     callstart = time (NULL);
  340.  
  341.     if (mr >= FAX)                /* FAX is > 16 */
  342.     {
  343.         int gotfax = 1;
  344.         int i;
  345.  
  346.         if (!fax_in)
  347.         {
  348.             /* We have a FAX result code but are not configured to
  349.                receive any. See if the user has set up a fax exit
  350.                using the external mail strings */
  351.  
  352.             for (i = 0; i < num_ext_mail; i++)
  353.             {
  354.                 if (stricmp (saved_response, ext_mail_string[i]) == 0)
  355.                 {
  356.                     last_type (5, &alias[0]);
  357.                     UUCPexit (lev_ext_mail[i], 0);
  358.                 }
  359.             }
  360.         }
  361.         else
  362.         {
  363.             start_hist = hist;
  364.             last_type (5, &alias[0]);
  365.             gotfax = faxreceive (FAX);    /* Try to get a FAX */
  366.         }
  367.  
  368.         mdm_hangup ();            /* Then hang up     */
  369.  
  370.         callend = time (NULL);
  371.         hist.last_Elapsed = callend - callstart;
  372.         hist.callcost += cost_of_call (0, callstart, callend);
  373.  
  374.         if (gotfax)                /* If we got one,   */
  375.         {
  376.             got_fax = 1;        /* Say we got mail  */
  377.             receive_exit ();    /* And try to exit  */
  378.         }
  379.     }
  380.     else if (CARRIER)            /* if we have a carrier,      */
  381.     {
  382.         b_session (0);            /* do a mail session          */
  383.  
  384.         mdm_hangup ();            /* Make sure to hang up       */
  385.  
  386.         callend = time (NULL);
  387.         hist.last_Elapsed = callend - callstart;
  388.         hist.callcost += cost_of_call (0, callstart, callend);
  389.  
  390.         /* We got inbound mail */
  391.         if (got_arcmail || got_packet || got_mail)
  392.         {
  393.             receive_exit ();
  394.         }
  395.     }
  396.     else
  397.     {
  398.         mdm_hangup ();            /* Try to reset modem         */
  399.  
  400.         callend = time (NULL);
  401.         hist.last_Elapsed = callend - callstart;
  402.         hist.callcost += cost_of_call (0, callstart, callend);
  403.     }
  404.  
  405.     mailer_banner ();
  406.     return (1);
  407. }
  408.  
  409. void 
  410. receive_exit ()
  411. {
  412.     char junk1[150];
  413.     int i;
  414.     BINK_EVENT evt;
  415.  
  416.     if (cur_event >= 0)
  417.         evt = e_ptrs[cur_event];
  418.  
  419.     if (cur_event >= 0)
  420.     {
  421.         int errlvl = 0;
  422.         int exitlvl = 0;
  423.  
  424.         if (got_arcmail && (evt.errlevel[2]))
  425.         {
  426.             exitlvl = evt.errlevel[2];
  427.             if (errlvlshell[exitlvl - 1] == NULL)
  428.             {
  429.                 errlvl = exitlvl;
  430.                 status_line (MSG_TXT (M_EXIT_COMPRESSED), errlvl);
  431.             }
  432.             else
  433.             {
  434.                 status_line (MSG_TXT (M_SHELL_COMPRESSED), exitlvl);
  435.                 errl_shell (exitlvl);
  436.                 got_arcmail = got_mail = got_packet = 0;
  437.             }
  438.  
  439.         }
  440.  
  441.         for (i = 0; i < 6; i++)
  442.         {
  443.             if (user_exits[i])
  444.             {
  445.                 user_exits[i] = 0;
  446.                 exitlvl = evt.errlevel[i + 3];
  447.  
  448.                 if (errlvlshell[exitlvl - 1] == NULL)
  449.                 {
  450.                     if (errlvl == 0)
  451.                     {
  452.                         errlvl = exitlvl;
  453.                         status_line (MSG_TXT (M_EXIT_AFTER_EXTENT),
  454.                             &(evt.err_extent[i][0]), errlvl);
  455.                     }
  456.                 }
  457.                 else
  458.                 {
  459.                     status_line (MSG_TXT (M_SHELL_AFTER_EXTENT),
  460.                         &(evt.err_extent[i][0]), exitlvl);
  461.                     errl_shell (exitlvl);
  462.  
  463.                 }
  464.  
  465.             }
  466.         }
  467.  
  468. #ifdef BINKLEY_SOUNDS
  469.         /*     If we got an exit level, it's still set even if we shelled.
  470.             So use its presence to determine whether to make noise */
  471.  
  472.         if (exitlvl)
  473.             Make_Sound (fnFileSound);
  474. #endif
  475.         /*    See if we still want to exit */
  476.         if (errlvl)
  477.             errl_exit (errlvl);
  478.     }
  479.  
  480.     if (got_fax && cur_event >= 0 && (evt.faxerrlevel))
  481.     {
  482. #ifdef BINKLEY_SOUNDS
  483.         Make_Sound (fnFAXSound);
  484. #endif
  485.         if (errlvlshell[evt.faxerrlevel - 1] != NULL)
  486.         {
  487.             status_line (MSG_TXT (M_SHELL_FAX), evt.faxerrlevel);
  488.             errl_shell (evt.faxerrlevel);
  489.             got_fax = 0;
  490.         }
  491.         else
  492.         {
  493.             status_line (MSG_TXT (M_EXIT_FAX), evt.faxerrlevel);
  494.             errl_exit (evt.faxerrlevel);
  495.         }
  496.     }
  497.  
  498.     if ((got_fax || got_mail || got_packet) &&
  499.         (cur_event >= 0) && (evt.errlevel[1]))
  500.     {
  501. #ifdef BINKLEY_SOUNDS
  502.         Make_Sound (fnMailSound);
  503. #endif
  504.         if (errlvlshell[evt.errlevel[1] - 1] != NULL)
  505.         {
  506.             status_line (MSG_TXT (M_SHELL_AFTER_MAIL), evt.errlevel[1]);
  507.             errl_shell (evt.errlevel[1]);
  508.             got_fax = got_mail = got_packet = 0;
  509.         }
  510.         else
  511.         {
  512.             status_line (MSG_TXT (M_EXIT_AFTER_MAIL), evt.errlevel[1]);
  513.             errl_exit (evt.errlevel[1]);
  514.         }
  515.     }
  516.  
  517.     if ((aftermail != NULL) && (got_fax || got_mail || got_packet || got_arcmail))
  518.     {
  519.         status_line (MSG_TXT (M_AFTERMAIL));
  520. #ifdef BINKLEY_SOUNDS
  521.         Make_Sound (fnMailSound);
  522. #endif
  523.         mdm_init (modem_busy);
  524.         exit_DTR ();
  525.         screen_clear ();
  526.         vfossil_cursor (1);
  527.         (void) strcpy (junk1, aftermail);
  528.         if (cur_event >= 0)
  529.             (void) strcat (junk1, evt.cmd);
  530.         close_up ();
  531.         b_spawn (junk1);
  532.         come_back ();
  533.         RAISE_DTR ();
  534.         status_line (MSG_TXT (M_OK_AFTERMAIL));
  535.         mdm_init (modem_init);
  536.         xmit_reset (0);
  537.         waitfor_line = timerset ((unsigned int) 6000);
  538.     }
  539.  
  540.     got_arcmail = 0;
  541.     got_packet = 0;
  542.     got_mail = 0;
  543.     got_fax = 0;
  544. }
  545.  
  546. void 
  547. errl_exit (int n)
  548. {
  549.     write_sched ();
  550.  
  551.     status_line (MSG_TXT (M_BINK_END), ANNOUNCE, COMPILER_NAME);
  552.     mdm_init (modem_busy);        /* Reinitialize the modem     */
  553.     exit_DTR ();
  554.     if (fullscreen)
  555.         gotoxy (0, SB_ROWS);
  556.  
  557.     if (vfossil_installed)
  558.         vfossil_close ();
  559.  
  560.     if (!share)
  561.         MDM_DISABLE ();
  562.     exit (n);
  563. }
  564.  
  565. void
  566. errl_shell (int n)
  567. {
  568.     write_sched ();
  569.  
  570.     if (!strnicmp ("start ", errlvlshell[n - 1], 6))
  571.     {
  572.         status_line (MSG_TXT (M_START_ERRLVL_SESSION), n);
  573.         system (errlvlshell[n - 1]);
  574.     }
  575.     else
  576.     {
  577.         mdm_init (modem_busy);
  578.         exit_DTR ();
  579.         close_up ();
  580.         screen_clear ();
  581.         vfossil_cursor (1);
  582.         b_spawn (errlvlshell[n - 1]);
  583.         come_back ();
  584.         RAISE_DTR ();
  585.         status_line (MSG_TXT (M_RETURN_ERRLVL_SHELL));
  586.         mdm_init (modem_init);
  587.         xmit_reset (0);
  588.         waitfor_line = timerset ((unsigned int) 6000);
  589.     }
  590. }
  591.  
  592. long 
  593. random_time (int x)
  594. {
  595.     int i;
  596.  
  597.     if (x == 0)
  598.     {
  599.         return (0L);
  600.     }
  601.  
  602.     /* Number of seconds to delay is random based on x +/- 50% */
  603.     i = (rand () % (x + 1)) + (x / 2);
  604.  
  605.     return (timerset ((unsigned int) (i * 100)));
  606. }
  607.  
  608. char *
  609. HoldAreaNameMunge (ADDRP maddr)
  610. {
  611.     static char munged[127];
  612.     register char *p, *q;
  613.     int i;
  614.  
  615.     if ((maddr->Domain != my_addr.Domain) && (maddr->Domain != NULL))
  616.     {
  617.         *domain_loc = '\0';
  618.         (void) strcpy (munged, domain_area);
  619.         q = &(munged[strlen (munged)]);
  620.         for (i = 0; domain_name[i] != NULL; i++)
  621.         {
  622.             if (domain_name[i] == maddr->Domain)
  623.             {
  624.                 if (domain_abbrev[i] != NULL)
  625.                 {
  626.                     p = domain_abbrev[i];
  627.                     while (*p)
  628.                         *q++ = *p++;
  629.                     if (no_zones)
  630.                         (void) sprintf (q, "\\");
  631.                     else
  632.                         (void) sprintf (q, ".%03x\\", maddr->Zone);
  633.                 }
  634.                 break;
  635.             }
  636.         }
  637.     }
  638.     else
  639.     {
  640.         (void) strcpy (munged, hold_area);
  641.         q = &(munged[strlen (munged)]);
  642.         if (!((maddr->Zone == alias[0].Zone) || (no_zones)))
  643.         {
  644.             --q;
  645.             (void) sprintf (q, ".%03x\\", maddr->Zone);
  646.         }
  647.     }
  648.     return (munged);
  649. }
  650.  
  651. void 
  652. mailer_banner ()
  653. {
  654.     if (fullscreen && un_attended)
  655.     {
  656.         vfossil_cursor (0);
  657.  
  658.         (void) sprintf (junk, "%-2d", cur_event + 1);
  659.         sb_move (settingswin, SET_EVNT_ROW, SET_COL);
  660.         sb_puts (settingswin, junk);
  661.  
  662.         (void) sprintf (junk, "%-6lu Com%d", cur_baud.rate_value, port_ptr + 1);
  663.         sb_move (settingswin, SET_PORT_ROW, SET_COL);
  664.         sb_puts (settingswin, junk);
  665.         clear_filetransfer ();
  666.  
  667.         if (TaskNumber)
  668.             (void) sprintf (junk, "M'Task: %-7s %02x", mtask_name, TaskNumber);
  669.         else
  670.             (void) sprintf (junk, "M'Task: %s", mtask_name);
  671.         sb_move (settingswin, SET_TASK_ROW, 2);
  672.         sb_puts (settingswin, "                   ");
  673.         sb_move (settingswin, SET_TASK_ROW, 2);
  674.         sb_puts (settingswin, junk);
  675.     }
  676.     (void) set_baud (max_baud.rate_value, 0);
  677. }
  678.  
  679. void 
  680. clear_filetransfer ()
  681. {
  682.     if (fullscreen && un_attended)
  683.         sb_fillc (filewin, ' ');
  684. }
  685.  
  686. static char ebuf[50];
  687.  
  688. static char *LOCALFUNC 
  689. estring (int e, int how_big)
  690. {
  691.     char j[30];
  692.     char *p, *q;
  693.  
  694.     *(p = &ebuf[0]) = '\0';
  695.     if (e >= 0)
  696.     {
  697.         if (e_ptrs[e].behavior & MAT_BBS)
  698.         {
  699.             *p++ = 'B';
  700.             if (how_big)
  701.                 *p++ = ' ';
  702.         }
  703.         if (e_ptrs[e].behavior & MAT_CM)
  704.         {
  705.             *p++ = 'C';
  706.             if (how_big)
  707.                 *p++ = ' ';
  708.         }
  709.         if (e_ptrs[e].behavior & MAT_DYNAM)
  710.         {
  711.             *p++ = 'D';
  712.             if (how_big)
  713.                 *p++ = ' ';
  714.         }
  715.         if (how_big && (e_ptrs[e].behavior & MAT_FORCED))
  716.         {
  717.             *p++ = 'F';
  718.             *p++ = ' ';
  719.         }
  720.         if (e_ptrs[e].behavior & MAT_HIPRICM)
  721.         {
  722.             *p++ = 'H';
  723.             if (how_big)
  724.                 *p++ = ' ';
  725.         }
  726.         if (e_ptrs[e].behavior & MAT_NOCM)
  727.         {
  728.             *p++ = 'K';
  729.             if (how_big)
  730.                 *p++ = ' ';
  731.         }
  732.         if (e_ptrs[e].behavior & MAT_LOCAL)
  733.         {
  734.             *p++ = 'L';
  735.             if (how_big)
  736.             {
  737.                 if (e_ptrs[e].node_cost >= 0)
  738.                     (void) sprintf (j, "<%d ", (e_ptrs[e].node_cost) + 1);
  739.                 else
  740.                     (void) sprintf (j, ">%d ", -(e_ptrs[e].node_cost) - 1);
  741.                 q = j;
  742.                 while (*q)
  743.                     *p++ = *q++;
  744.             }
  745.         }
  746.         if (how_big && (e_ptrs[e].behavior & MAT_NOMAIL24))
  747.         {
  748.             *p++ = 'M';
  749.             *p++ = ' ';
  750.         }
  751.         if (e_ptrs[e].behavior & MAT_NOREQ)
  752.         {
  753.             *p++ = 'N';
  754.             if (how_big)
  755.                 *p++ = ' ';
  756.         }
  757.         if (e_ptrs[e].behavior & MAT_OUTONLY)
  758.         {
  759.             *p++ = 'S';
  760.             if (how_big)
  761.                 *p++ = ' ';
  762.         }
  763.         if (e_ptrs[e].behavior & MAT_NOOUT)
  764.         {
  765.             *p++ = 'R';
  766.             if (how_big)
  767.                 *p++ = ' ';
  768.         }
  769.         if (how_big && (e_ptrs[e].behavior & MAT_NOOUTREQ))
  770.             *p++ = 'X';
  771.     }
  772.     *p = '\0';
  773.     return (ebuf);
  774. }
  775.  
  776. void 
  777. do_ready (char *str)
  778. {
  779.     if (fullscreen && un_attended)
  780.     {
  781.         if (!doing_poll)
  782.         {
  783.             clear_filetransfer ();
  784.         }
  785.         (void) sprintf (junk, "%-2d/%-6.6s", cur_event + 1, estring (cur_event, 0));
  786.         sb_move (settingswin, SET_EVNT_ROW, SET_COL);
  787.         sb_puts (settingswin, junk);
  788.         sb_move (settingswin, SET_STAT_ROW, SET_COL);
  789.         sb_puts (settingswin, str);
  790.         sb_show ();
  791.     }
  792. }
  793.  
  794. void 
  795. list_next_event ()
  796. {
  797.     int i;
  798.     char *p;
  799.     char j[100];
  800.  
  801.     i = time_to_next (0);
  802.  
  803.     if ((next_event >= 0) && fullscreen)
  804.     {
  805.         clear_filetransfer ();
  806.  
  807.         (void) sprintf (j, MSG_TXT (M_NEXT_EVENT), next_event + 1, i);
  808.         sb_move (filewin, 1, 2);
  809.         sb_puts (filewin, j);
  810.         p = estring (next_event, 1);
  811.         if (*p != '\0')
  812.         {
  813.             (void) sprintf (j, MSG_TXT (M_EVENT_FLAGS), p);
  814.             sb_move (filewin, 2, 2);
  815.             sb_puts (filewin, j);
  816.         }
  817.         if (netmail != NULL)
  818.             scan_netmail (j);
  819.  
  820.         sb_show ();
  821.     }                            /* If next event and fullscreen      */
  822. }
  823.  
  824. /* Temp area j passed from function above. Sorta messy but can't
  825. afford too many stack variables on DOS */
  826.  
  827. static void 
  828. scan_netmail (char *j)
  829. {
  830.     int i, k;
  831.     short iReadT[2];
  832.     FILE *fpt;
  833.     struct FILEINFO dta = {0};
  834.  
  835.     if (*netmail == '$')
  836.     {
  837.         if (SquishScan (netmail + 1))
  838.         {
  839.             sb_move (filewin, 2, 50);
  840.             sb_puts (filewin, MSG_TXT (M_UNREAD_NETMAIL));
  841.         }
  842.     }
  843.     else
  844.     {
  845.         (void) strcpy (j, netmail);
  846.         (void) strcat (j, "LASTREAD");    /* Full path to LASTREAD  */
  847.  
  848.         fpt = share_fopen (j, read_binary, DENY_WRITE);    /* Open the file          */
  849.         if (fpt != NULL)
  850.         {
  851.         /*
  852.             * Try to read two records. If there are two, the first record is the
  853.             * current pointer and the second one is the last-read. If there is
  854.             * one record, it is the last-read.
  855.             */
  856.  
  857.             i = fread (iReadT, sizeof (short), 2, fpt);    /* Get lastread ptr   */
  858.  
  859.             (void) fclose (fpt);    /* Then close the file*/
  860.             if (i)
  861.             {
  862.                 int f = 0;
  863.  
  864.                 k = iReadT[i - 1];    /* Last msg read      */
  865.                 (void) strcpy (j, netmail);
  866.                 (void) strcat (j, "*.msg");    /* Wildcard for .MSG  */
  867.                 while (!dfind (&dta, j, f))    /* If there are any,  */
  868.                 {
  869.                     f = 1;
  870.                     if (atoi (dta.name) > k)    /* See if one's more  */
  871.                     {
  872.                         sb_move (filewin, 2, 50);
  873.                         sb_puts (filewin, MSG_TXT (M_UNREAD_NETMAIL));
  874.                         break;
  875.                     }
  876.                 }
  877.                 if (f)
  878.                     (void) dfind (&dta, NULL, 2);
  879.             }                /* If any records read from LASTREAD */
  880.         }                    /* If we were able to open LASTREAD  */
  881.     }                        /* If the user specified NetMail     */
  882. }
  883.